<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>测试箭头函数</title>
</head>
<body>
<script type="text/javascript">
    f({
        测试箭头函数1:function () {
            //箭头函数相当于匿名函数，
           return 1*9;
        },
        //下面这个写法跟上面一样//箭头函数相当于匿名函数，//这种是只包含表达式的//这种其实也代表有一个参数x,只是没有用而已
        测试箭头函数2:x=>1*8,
        //下面这种实包含多条件语句的//箭头匿名函数//这个代表有一个参数x
        测试箭头函数3:x => {
            if (x > 0) {
                return x * x;
            }
            else {
                return - x * x;
            }
        },
        //下面的箭头函数代表有2个参数你//其实后面是表达式可以不用大括号
        箭头函数4:(x,y)=>{
           return  x * x + y * y
        },
        // 如果要返回一个对象，就要注意，如果是单表达式，这么写的话会报错
        // x => { foo: x }
        //因为和函数体的{ ... }有语法冲突，所以要改为//这种返回对象
        箭头函数5:x => ({ foo: x })
    });

    function f(obj){
        let 测试箭头函数1 = obj.测试箭头函数1();
        // alert(测试箭头函数1);
        let 测试箭头函数2 = obj.测试箭头函数2();
        // alert(测试箭头函数2);
        let 测试箭头函数3 = obj.测试箭头函数3(-9);
        // alert(测试箭头函数3);
        let 箭头函数4 = obj.箭头函数4(4,5);
        // alert(箭头函数4);
        let 箭头函数5 = obj.箭头函数5;
        // alert(JSON.stringify(箭头函数5(45)));// {"foo":45}


    }


    //注意下面这个函数不会被 加载,而上面那个函数会被加载是因为一开始就调用了f()函数,这是 期银技巧
    function f1() {
        alert("fuck");
    }

    //下面讲述箭头函数修复js绑定this为window的纠正,现在完全好了
    window.onload=function () {
        var obj = {
            birth: 1990,
            getAge: function () {
                var b = this.birth; // 1990
                var fn = function () {//加一层函数this指向改变了
                    return new Date().getFullYear() - this.birth; // this指向window或undefined
                };
                return fn();
            }
        };
        // alert(obj.getAge());//达不到预期效果是因为this指向了我们不想要的地方

        //现在，箭头函数完全修复了this的指向，this总是指向词法作用域，也就是外层调用者obj：
        var obj = {
            birth: 1990,
            getAge: function () {
                var b = this.birth; // 1990
                var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
                return fn();
            }
        };

        // alert(obj.getAge()); // 30


        // 由于this在箭头函数中已经按照词法作用域绑定了，所以，用call()或者apply()调用箭头函数时，无法对this进行绑定，即传入的第一个参数被忽略：
        var obj = {
            birth: 1990,
            getAge: function (year) {
                var b = this.birth; // 1990
                var fn = (y) => y - this.birth; // this.birth仍是1990
                return fn.call({birth:2000}, year);
            }
        };
        // alert(obj.getAge(2015)); // 25


    }
</script>
</body>
</html>